package com.bjc.base.utils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.regex.Pattern;

/**
 * java 8 LocalDateTime 时间转换工具类 
 * Instant——它代表的是时间戳 
 * LocalDate——不包含具体时间的日期，比如2014-01-14。它可以用来存储生日，周年纪念日，入职日期等。 
 * LocalTime——它代表的是不含日期的时间 – LocalDateTime——它包含了日期及时间，不过还是没有偏移信息或者说时区。 
 * ZonedDateTime——这是一个包含时区的完整的日期时间，偏移量是以UTC/格林威治时间为基准的。
 * 
 * 
SQL -> Java
--------------------------
date -> LocalDate
time -> LocalTime
timestamp -> LocalDateTime
 */
/**
 * java8时间工具类
 *
 * @author 许自辉
 * @date 2017年10月18日
 */
public final class DateUtils {

	/**
	 * YYYY-MM-DD HH:mm:SS
	 */
	static String rexpDateTime = "^((((1[6-9]|[2-9]\\d)\\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-0?2-(0?[1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-)) (20|21|22|23|[0-1]?\\d):[0-5]?\\d:[0-5]?\\d$";
	/**
	 * YYYY-MM-DD HH:mm
	 */
	static String rexpDateTime1 = "^((((1[6-9]|[2-9]\\d)\\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-0?2-(0?[1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-)) (20|21|22|23|[0-1]?\\d):[0-5]?\\d$";
	/**
	 * YYYY-MM-DD
	 */
	static String rexpDate = "^((((1[6-9]|[2-9]\\d)\\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-0?2-(0?[1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$";

	/**
	 * 默认时间格式
	 */
	private static final DateTimeFormatter DEFAULT_DATE_FORMATTER = TimeFormat.SHORT_DATE_PATTERN_LINE.formatter;
	private static final DateTimeFormatter DEFAULT_DATETIME_FORMATTER = TimeFormat.LONG_DATE_PATTERN_LINE.formatter;

	/**
	 * 无参数的构造函数,防止被实例化
	 */
	private DateUtils() {
	};

	/**
	 * String 各种格式转化为 LocalDateTime
	 */
	public static LocalDateTime autoParseTime(String timeStr) {
		Pattern patDate = Pattern.compile(rexpDate);
//		Pattern patDateTime = Pattern.compile(rexpDateTime);
		Pattern patDateTime1 = Pattern.compile(rexpDateTime1);
		if (patDate.matcher(timeStr).matches()) {
			timeStr += " 00:00:00";
		} else if (patDateTime1.matcher(timeStr).matches()) {
			timeStr += ":00";
		} else {
		}
		return LocalDateTime.parse(timeStr, DEFAULT_DATETIME_FORMATTER);

	}

	/**
	 * String 转化为 LocalDateTime
	 */
	public static LocalDateTime parseTime(String timeStr) {
		return LocalDateTime.parse(timeStr, DEFAULT_DATETIME_FORMATTER);

	}

	/**
	 * String 转化为 LocalDateTime
	 */
	public static LocalDateTime parseTime(String timeStr, TimeFormat timeFormat) {
		return LocalDateTime.parse(timeStr, timeFormat.formatter);

	}

	/**
	 * LocalDateTime 转化为String
	 */
	public static String parseTime(LocalDateTime time) {
		return DEFAULT_DATETIME_FORMATTER.format(time);

	}

	/**
	 * LocalDateTime 时间转 String
	 */
	public static String parseTime(LocalDateTime time, TimeFormat format) {
		return format.formatter.format(time);

	}

	/**
	 * LocalDate 转化为String
	 */
	public static String dataToString(LocalDate time) {
		return DEFAULT_DATE_FORMATTER.format(time);

	}

	/**
	 * LocalDateTime 时间转 String
	 */
	public static String dataToString(LocalDate time, TimeFormat format) {
		return format.formatter.format(time);

	}

	/**
	 * 获取当前时间
	 */
	public static String getCurrentDateTime() {
		return DEFAULT_DATETIME_FORMATTER.format(LocalDateTime.now());
	}

	/**
	 * 获取当前时间
	 */
	public static String getCurrentDateTime(TimeFormat timeFormat) {
		return timeFormat.formatter.format(LocalDateTime.now());
	}

	/**
	 * 时间格式化为double类型
	 * 
	 * @param str
	 * @return
	 */
	public static double getDoubleTime(String[] str) {
		double outTime = 0;
		double onTime1;
		onTime1 = ((Double.parseDouble(str[1])) / 60);
		outTime = Double.parseDouble(str[0]) + onTime1;
		return outTime;
	}

	public static double getDoubleTimeSpace(String[] str1, String[] str2) {
		return getDoubleTime(str1) - getDoubleTime(str2);
	}


	/**
	 * 内部枚举类
	 */
	public enum TimeFormat {
		// 短时间格式 年月日
		SHORT_DATE_PATTERN_LINE("yyyy-MM-dd"), SHORT_DATE_PATTERN_SLASH("yyyy/MM/dd"),

		// 长时间格式 年月日时分秒
		LONG_DATE_PATTERN_LINE("yyyy-MM-dd HH:mm:ss"), LONG_DATE_PATTERN_SLASH("yyyy/MM/dd HH:mm:ss"),

		// 长时间格式 年月日时分秒 带毫秒
		LONG_DATE_PATTERN_WITH_MILSEC_LINE("yyyy-MM-dd HH:mm:ss.SSS"), LONG_DATE_PATTERN_WITH_MILSEC_SLASH(
				"yyyy/MM/dd HH:mm:ss.SSS");

		private transient DateTimeFormatter formatter;

		TimeFormat(String pattern) {
			formatter = DateTimeFormatter.ofPattern(pattern);

		}
	}

}
